package com.atguigu.gmall.service.impl;

import com.atguigu.gmall.entity.CartInfo;
import com.atguigu.gmall.service.AsyncCartInfoService;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class TestTempCartList {

    private AsyncCartInfoService asyncCartInfoService;

    /*合并临时的购物车*/
    public List<CartInfo> getCartList(String userId, String userTempId) {
        List<CartInfo> cartInfoList = new ArrayList<>();
        //当用户没有登录的时候去查询临时用户购物车的信息
        if (StringUtils.isEmpty(userId)) {
            cartInfoList = getUserCartList(userTempId);
        }
        //当用户登录之后
        if (!StringUtils.isEmpty(userId)) {
            //查询未登录用户购物车信息 方便合并
            List<CartInfo> noLoginCartInfoList = getUserCartList(userTempId);
            if (!CollectionUtils.isEmpty(noLoginCartInfoList)) {
                //当未登录购物车中有数据则合并。
                cartInfoList = mergeCartList(noLoginCartInfoList, userId);
                //合并完成之后，删除未登录购物车
                deleteNoLoginCartList(userTempId);
            }
            //细节问题：如果未登录数据是空 或者 userTempId 是空，都会直接查询数据库(实在不行就去掉)
            if (CollectionUtils.isEmpty(noLoginCartInfoList) || StringUtils.isEmpty(userTempId)) {
                // 登录的userId不为空，查询userId 购物车
                cartInfoList = getUserCartList(userId);
            }
        }
        return cartInfoList;
    }
    //根据userId获取购物车列表数据
    private List<CartInfo> getUserCartList(String oneOfUserId) {
        List<CartInfo> cartInfoList = new ArrayList<>();
        //如果临时用户id为空
        if (StringUtils.isEmpty(oneOfUserId)) {
            return cartInfoList;
        }
        cartInfoList = queryFromDbToRedis(oneOfUserId); //去redis 中查询购物车信息
        if (!CollectionUtils.isEmpty(cartInfoList)) {
            // 循环遍历获取里面的数据，原因？查询购物车列表时，应该有排序功能！ 按照商品的更新时间进行排序
            // 由于我们这个table 没有更新时间字段 | 在此按照id 进行排序。
            cartInfoList.sort(new Comparator<CartInfo>() {
                @Override
                public int compare(CartInfo o1, CartInfo o2) {
                    return o1.getId().compareTo(o2.getId());
                }
            });
            //简写方式
            //cartInfoList.sort((o1,o2)->o1.getId().compareTo(o2.getId()));
            //cartInfoList.sort(Comparator.comparing(CartInfo::getId));
        }
        // 返回排序好的集合数据
        return cartInfoList;
    }

    private List<CartInfo> queryFromDbToRedis(String oneOfUserId) {
        //此id为 用户id或临时id

        return null;
    }

    // 合并购物车数据
    private List<CartInfo> mergeCartList(List<CartInfo> noLoginCartInfoList, String userId) {
        List<CartInfo> loginCartInfoList = getUserCartList(userId);
        //就相当于迭代list往map中放数据
        Map<Long, CartInfo> loginCartInfoMap = loginCartInfoList.stream().collect(Collectors.toMap(CartInfo::getSkuId, cartInfo -> cartInfo));
        for (CartInfo noLoginCartInfo : noLoginCartInfoList) {
            Long skuId = noLoginCartInfo.getSkuId();
            //判断登录和未登录有相同商品
            if (loginCartInfoMap.containsKey(skuId)) {
                // 商品的数量进行相加操作
                CartInfo loginCartInfo = loginCartInfoMap.get(skuId);
                loginCartInfo.setSkuNum(loginCartInfo.getSkuNum() + noLoginCartInfo.getSkuNum());
                //细节: 合并选中细节 未登录购物车选中状态，那么则数据库为选中状态
                if (noLoginCartInfo.getIsChecked().intValue() == 1) {
                    loginCartInfo.setIsChecked(1);
                }
                // 更新数据库操作
                asyncCartInfoService.updateCartInfo(loginCartInfo);
            } else {
                // 没有包含的说明没有对应的商品，noLoginCartInfo 放入数据  39
                // 将未登录用户Id 设置成已登录的用户Id
                noLoginCartInfo.setUserId(userId);
                asyncCartInfoService.saveCartInfo(noLoginCartInfo);
            }
        }
        //把缓存里面的信息全部更新一下
        List<CartInfo> cartInfoList = queryFromDbToRedis(userId);
        return cartInfoList;
    }

    // 删除未登录购物车数据
    private void deleteNoLoginCartList(String userTempId) {
        asyncCartInfoService.deleteCartInfo(userTempId,null);
        // 获取缓存的key
        //String cartKey = getCartKey(userTempId);
        // 判断缓存有这个key没有
//        Boolean flag = redisTemplate.hasKey(cartKey);
//        if (flag) {
//            redisTemplate.delete(cartKey);
//        }
    }
}
